package com.hu.proxy;

import com.hu.RpcApplication;
import java.lang.reflect.Proxy;

/**
 * 服务代理工厂（用于创建代理对象）
 */
public class ServiceProxyFactory {

    /**
     * 根据服务类获取代理对象
     *
     * @param serviceClass
     * @param <T>
     * @return
     */
    public static <T> T getProxy(Class<T> serviceClass) {
        if (RpcApplication.getRpcConfig().isMock()) {
            return getMockProxy(serviceClass);
        }
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new ServiceProxy());
    }

    /**
     * 根据服务类获取 Mock 代理对象
     *
     * @param serviceClass
     * @param <T>
     * @return
     */
    public static <T> T getMockProxy(Class<T> serviceClass) {
        return (T) Proxy.newProxyInstance(
                //Java提供的用于创建动态代理对象的方法。它需要三个参数
                serviceClass.getClassLoader(),
                //第一个参数是类加载器，用于加载代理类。这里使用的是目标服务接口的类加载器。
                new Class[]{serviceClass},
                // 第二个参数是一个数组，包含了一个或多个接口，代理对象需要实现这些接口。
                new MockServiceProxy());
        //第三个参数是一个实现了 InvocationHandler 接口的实例。
        // 这个实例负责处理所有对代理对象的方法调用。在这个例子中，我们创建了一个 MockServiceProxy 实例。
    }
}